/* ******************************************************************
 * ILP -- Implantation d'un langage de programmation.
 * Copyright (C) 2004 <Christian.Queinnec@lip6.fr>
 * $Id: CEASTprogram.java 1238 2012-09-12 15:31:08Z queinnec $
 * GPL version>=2
 * ******************************************************************/

package fr.upmc.ilp.ilp3;

import org.w3c.dom.Element;

import fr.upmc.ilp.ilp1.runtime.EvaluationException;
import fr.upmc.ilp.ilp2.ast.CEASTparseException;
import fr.upmc.ilp.ilp2.interfaces.IAST2functionDefinition;
import fr.upmc.ilp.ilp2.interfaces.IAST2instruction;
import fr.upmc.ilp.ilp2.interfaces.IAST2program;
import fr.upmc.ilp.ilp2.interfaces.ICommon;
import fr.upmc.ilp.ilp2.interfaces.ILexicalEnvironment;
import fr.upmc.ilp.ilp2.interfaces.IParser;

/** La classe d'un programme composé de fonctions globales et
 * d'instructions. */

public class CEASTprogram
extends fr.upmc.ilp.ilp2.ast.CEASTprogram {

    public CEASTprogram (
            final IAST2functionDefinition<CEASTparseException>[] definitions,
            final IAST2instruction<CEASTparseException> body ) {
        super(definitions, body);
    }

    /** Le constructeur analysant syntaxiquement un DOM. */

    public static IAST2program<CEASTparseException> parse (
            final Element e, final IParser<CEASTparseException> parser)
    throws CEASTparseException {
        return fr.upmc.ilp.ilp2.ast.CEASTprogram.parse(e, parser);
    }

    //NOTE: Accès direct aux champs interdit à partir d'ici!

  @Override
  public Object eval (final ILexicalEnvironment lexenv,
                      final ICommon common)
    throws EvaluationException {
      IAST2functionDefinition<CEASTparseException>[] definitions =
          getFunctionDefinitions();
      for ( int i = 0 ; i<definitions.length ; i++ ) {
          definitions[i].eval(lexenv, common);
      }
      Object result = null;
      try {
          result = getBody().eval(lexenv, common);
      } catch ( ThrownException exc ) {
          // Deballer la valeur si c'est une valeur obtenue par
          // echappement. Cela revient a admettre qu'un programme P est
          // equivalent a try { P } catch (e) { e };
          result = exc.getThrownValue();
      }
      return result;
  }
}

// end of CEASTprogram.java
